'''
Created on 10/10/2012

@author: rcasal
'''
from domain.entities.direccion import Localidad, Barrio, Provincia, Departamento
from repositories.i_repository import IRepository
from gluon.dal import Field

class ProvinciaRepository(IRepository):
    '''
    classdocs
    '''

    def __init__(self, datoscomunes, T):
        '''
        Constructor
        '''
        self.__datoscomunes = datoscomunes
        self.__table = None
        self.__T = T
        
    def define_table(self, migrate = False):
        
        self.__datoscomunes.define_table('ProvinciasView',
        Field('Name', type = 'string', label = 'Nombre'),
        Field('Pref', type = 'string', label = 'Prefijo'),
        migrate = migrate
        )
        
        #dbDatosComunes.define_table('Provincias'
        #,Field('Prefijo', 'string', length = 1, required = True)
        #,Field('CodProvincial', 'integer', required = True)
        #,Field('Nombre', 'string', length = 50, required = True)
        #,primarykey=['Prefijo']
        #,migrate = False
        #)
        self.__table = self.__datoscomunes['ProvinciasView']
        
    def add_requires(self):
        raise NotImplementedError()
            
    def findOne(self, idProv):
        provincia = None
        res = self.__datoscomunes(self.__datoscomunes.ProvinciasView.id == idProv).select().last()
        if res:
            provincia = Provincia()
            provincia.ID = res.id
            provincia.nombre = res.Name
        return provincia
    
    def findAll(self, asdict = False):
        provincias = self.__datoscomunes(self.__datoscomunes.ProvinciasView.id > 0).select()
        if asdict == True:
            return provincias
        raise NotImplementedError()
    
    def save(self, entity):
        raise NotImplementedError()
    
    def delete(self, entity):
        raise NotImplementedError()
    
    
class DepartamentoRepository(IRepository):
    '''
    classdocs
    '''

    def __init__(self, datoscomunes, T):
        '''
        Constructor
        '''
        self.__datoscomunes = datoscomunes
        self.__table = None
        self.__T = T
        
    def define_table(self, migrate = False):
        
        self.__datoscomunes.define_table('Departamentos'
        ,Field('Nombre', 'string', length = 50, required = True)
        ,Field('Provincia', 'string', length = 1, required = True)
        ,Field('coddep_OLD', 'integer', required = True)
        ,migrate = migrate
        )
        self.__table = self.__datoscomunes['Departamentos']
        
    def add_requires(self):
        raise NotImplementedError()        
            
    def findOne(self, ident):
        departamento = None
        res = self.__datoscomunes(self.__datoscomunes.Departamentos.id == ident).select().last()
        if res:
            departamento = Departamento()
            departamento.ID = res.id
            departamento.nombre = res.Nombre
            departamento.provincia.ID = res.Provincia
        return departamento
    
    def findAll(self):
        raise NotImplementedError()
    
    def save(self, entity):
        raise NotImplementedError()
    
    def delete(self, entity):
        raise NotImplementedError()
    
class LocalidadRepository(IRepository):
    '''
    classdocs
    '''

    def __init__(self, datoscomunes, T):
        '''
        Constructor
        '''
        self.__datoscomunes = datoscomunes
        self.__table = None
        self.__T = T
        
    def define_table(self, migrate = False):
        
        self.__datoscomunes.define_table('Localidades'
        ,Field('IDDepartamento', 'integer', length = 4, required = True)
        ,Field('Nombre', 'string', length = 50, required = True)
#        ,Field('CodigoPostal', 'integer', length = 2, required = True)
#        ,Field('CodLocalDelegacion', 'integer', length = 1, required = True)
#        ,Field('codloc_old', 'integer', length = 4, required = True)
#         ,Field('PrefijoProvincia', 'string', length = 1, required = True)
#        ,Field('IDProvincia', 'integer', length = 4, required = True)
        ,migrate = migrate
        )
        self.__table = self.__datoscomunes['Localidades']
        
    def add_requires(self):
        raise NotImplementedError()
            
    def findOne(self, idLoc):
        localidad = None
        res = self.__datoscomunes(self.__datoscomunes.Localidades.id == idLoc).select().last()
        if res:
            localidad = Localidad()
            localidad.ID = res.id
            localidad.nombre = res.Nombre
            localidad.departamento.ID = res.IDDepartamento
        return localidad
    
    def findAll(self):
        raise NotImplementedError()
    
    def save(self, entity):
        raise NotImplementedError()
    
    def delete(self, entity):
        raise NotImplementedError()
    
    def findAllByProvincia(self, idProv):
        resultado = self.__datoscomunes((self.__datoscomunes.ProvinciasView.id == idProv) & (self.__datoscomunes.Departamentos.Provincia == self.__datoscomunes.ProvinciasView.Pref) & (self.__datoscomunes.Localidades.IDDepartamento == self.__datoscomunes.Departamentos.id)).select(self.__datoscomunes.Localidades.id, self.__datoscomunes.Localidades.Nombre, orderby = self.__datoscomunes.Localidades.Nombre)
        localidades = []
        for res in resultado:
            localidad = Localidad()
            localidad.ID = res.id
            localidad.nombre = res.Nombre
            localidades.append(localidad)
        return localidades
    
class BarrioRepository(IRepository):
    '''
    classdocs
    '''

    def __init__(self, datoscomunes, T):
        '''
        Constructor
        '''
        self.__datoscomunes = datoscomunes
        self.__table = None
        self.__T = T
        
    def define_table(self, migrate = False):
        
        self.__datoscomunes.define_table('Barrios'
        ,Field('Nombre', 'string', length = 50, required = True)
        ,migrate = migrate
        )
        self.__table = self.__datoscomunes['Barrios']
        
    def add_requires(self):
        raise NotImplementedError()
    
    def findOne(self, ident):
        barrio = None
        res = self.__datoscomunes(self.__datoscomunes.Barrios.id == ident).select().last()
        if res:
            barrio = Barrio()
            barrio.ID = res.id
            barrio.nombre = res.Nombre
        return barrio
    
    def findAll(self):
        resultado = self.__datoscomunes(self.__datoscomunes.Barrios.id > 0).select()
        barrios = []
        for res in resultado:
            barrio = Barrio()
            barrio.ID = res.id
            barrio.nombre = res.Nombre
            barrios.append(barrio)
        return barrios
    
    def save(self, entity):
        raise NotImplementedError()
    
    def delete(self, entity):
        raise NotImplementedError()
    